package com.kaf.common.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;

import java.io.Serializable;
/**
 * 统一API响应格式封装
 * 使用泛型以便灵活处理不同类型的数据
 * @param <T> 数据泛型
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResult<T> implements Serializable {
    /**
     * 状态码
     */
    private Integer code;

    /**
     * 消息
     */
    private String message;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 时间戳
     */
    private Long timestamp = System.currentTimeMillis();

    /**
     * 成功响应-无数据
     * @return CommonResult
     */
    public static <T> CommonResult<T> success() {
        return new CommonResult<>(HttpStatus.OK.value(), "操作成功", null, System.currentTimeMillis());
    }

    /**
     * 成功响应-带数据
     * @param data 响应数据
     * @return CommonResult
     */
    public static <T> CommonResult<T> success(T data) {
        return new CommonResult<>(HttpStatus.OK.value(), "操作成功", data, System.currentTimeMillis());
    }

    /**
     * 成功响应-自定义消息
     * @param message 自定义消息
     * @return CommonResult
     */
    public static <T> CommonResult<T> success(String message) {
        return new CommonResult<>(HttpStatus.OK.value(), message, null, System.currentTimeMillis());
    }

    /**
     * 成功响应-带数据和自定义消息
     * @param data 响应数据
     * @param message 自定义消息
     * @return CommonResult
     */
    public static <T> CommonResult<T> success(T data, String message) {
        return new CommonResult<>(HttpStatus.OK.value(), message, data, System.currentTimeMillis());
    }

    /**
     * 失败响应-默认状态码和消息
     * @return CommonResult
     */
    public static <T> CommonResult<T> fail() {
        return new CommonResult<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), "操作失败", null, System.currentTimeMillis());
    }

    /**
     * 失败响应-自定义消息
     * @param message 自定义消息
     * @return CommonResult
     */
    public static <T> CommonResult<T> fail(String message) {
        return new CommonResult<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), message, null, System.currentTimeMillis());
    }

    /**
     * 失败响应-自定义状态码和消息
     * @param code 状态码
     * @param message 消息
     * @return CommonResult
     */
    public static <T> CommonResult<T> fail(Integer code, String message) {
        return new CommonResult<>(code, message, null, System.currentTimeMillis());
    }

    /**
     * 失败响应-带数据
     * @param code 状态码
     * @param message 消息
     * @param data 数据
     * @return CommonResult
     */
    public static <T> CommonResult<T> fail(Integer code, String message, T data) {
        return new CommonResult<>(code, message, data, System.currentTimeMillis());
    }
}
